LOADING...

加载过慢请开启缓存(浏览器默认开启)

loading

LlamaIndex

2025/2/25 AI

LlamaIndex喂食给AI并进化升级

将您的企业数据转化为可用于生产的LLM应用程序

LLM 提供人与数据之间的自然语言接口。LLM 预先训练过大量公开数据,但它们并非基于您的数据进行训练。您的数据可能是私有的,也可能是特定于您要解决的问题的数据。它隐藏在 AP1后面、SQL 数据库中,或隐藏在PDF 和幻灯片中。上下文增强使 LLM 可以使用您的数据来解决手头的问题。Llamalndex 提供构建任何上下文增强用例的工具,从原型到生产我们的工具允许您提取、解析、索引和处理您的数据,并快速实施将数据访问与 LLM 提示相结合的复杂查询工作流。
上下文增强最流行的示例是检索增强生成RAG,它在推理时将上下文与ILLM 相结合。

LlamaIndex 是一个将大语言模型(Large Language Models, LLMs,后简称大模型)和外部数据连接在一起的工具。大模型依靠上下文学习(Context Learning)来推理知识,针对一个输入(或者是prompt),根据其输出结果。因此Prompt的质量很大程度上决定了输出结果的质量,因此提示工程(Prompt engineering)现在也很受欢迎。目前大模型的输入输出长度因模型结构、显卡算力等因素影响,都有一个长度限制(以Token为单位,ChatGPT限制长度为4k个,GPT-4是32k等,Claude最新版有个100k的)。当我们外部知识的内容超过这个长度时,就无法同时将有效的信息传递给大模型。因此就诞生了 LlamaIndex 等项目。

假设有一个10w的外部数据,我们的原始输入Prompt长度为100,长度限制为4k,通过查询-检索的方式,我们能将最有效的信息提取集中在这4k的长度中,与Prompt一起送给大模型,从而让大模型得到更多的信息。此外,还能通过多轮对话的方式不断提纯外部数据,达到在有限的输入长度限制下,传达更多的信息给大模型。这部分知识可参考

LLamaIndex的任务是通过查询、检索的方式挖掘外部数据的信息,并将其传递给大模型,因此其主要由x部分组成:

  1. 数据连接。首先将数据能读取进来,这样才能挖掘。

  2. 索引构建。要查询外部数据,就必须先构建可以查询的索引,llamdaIndex将数据存储在Node中,并基于Node构建索引。索引类型包括向量索引列表索引树形索引等;

  3. 查询接口。有了索引,就必须提供查询索引的接口。通过这些接口用户可以与不同的 大模型进行对话,也能自定义需要的Prompt组合方式。查询接口会完成 检索+对话的功能,即先基于索引进行检索,再将检索结果和之前的输入Prompt进行(自定义)组合形成新的扩充Prompt,对话大模型并拿到结果进行解析。

1 数据连接器(Data Connectors)

数据连接器,读取文档的工具,最简单的就是读取本地文件。 LLamaIndex 的数据连接器包括

  • 本地文件、Notion、Google 文档、Slack、Discord

具体可参考Data Connectors。

2 索引结构(Index Structures)

LlamaIndex 的核心其实就是 索引结构的集合,用户可以使用索引结构或基于这些索引结构自行建图。

2.1 索引如何工作

两个概念:

  • Node(节点):即一段文本(Chunk of Text),LlamaIndex读取文档(documents)对象,并将其解析/划分(parse/chunk)成 Node 节点对象,构建起索引。
  • Response Synthesis(回复合成):LlamaIndex 进行检索节点并响应回复合成,不同的模式有不同的响应模式(比如向量查询、树形查询就不同),合成不同的扩充Prompt。

索引方式包括

  • List Index:Node顺序存储,可用关键字过滤Node
  • Vector Store Index:每个Node一个向量,查询的时候取top-k相似
  • Tree Index:树形Node,从树根向叶子查询,可单边查询,或者双边查询合并。
  • **Keyword Table Index**:每个Node有很多个Keywords链接,通过查Keyword能查询对应Node。

不同的索引方式决定了Query选择Node方式的不同。

回复合成方式包括:

  • 创建并提纯(Create and Refine),即线性依次迭代;

  • 树形总结(Tree Summarize):自底向上,两两合并,最终合并成一个回复。

3 查询接口(Query Inference)

3.1 LlamaIndex 使用模板

LlamaIndex 常用使用模版:

  1. 读取文档 (手动添加or通过Loader自动添加);
  2. 将文档解析为Nodes;
  3. 构建索引(从文档or从Nodes,如果从文档,则对应函数内部会完成第2步的Node解析)
  4. [可选,进阶] 在其他索引上构建索引,即多级索引结构
  5. 查询索引并对话大模型

LangChain vs LlamaIndex

综合构建用于生产的高性能RAG程序 就用LlamaIndex
LlamaIndex官网参考:https://www.llamaindex.ai/
python文档参考:[LlamaIndex - LlamaIndex] (https://docs.llamaindex.ai/en/stable/)

LLM官网最下方的入门项目也需要学习
入门项目

RAG Work Flow

构建RAG管道—加载数据(镊取)

在您选择的 LLM 可以处理您的数据之前,您首先需要处理数据并加载数据。这与 ML 领域的数据清理/特征工程管道或传统数据设置中的 ETL 管道有相似之处。

此引入管道通常包括三个主要阶段:

  1. 加载数据
  2. 转换数据
  3. 索引和存储数据

我们将在后面的章节中介绍索引 / 存储。在本指南中,我们将主要讨论 loader 和 transformations。

装载机

在您选择的 LLM 可以处理您的数据之前,您需要加载它。LlamaIndex 执行此作的方式是通过数据连接器(也称为 .Data Connector 从不同的数据源摄取数据并将数据格式化为对象。A 是有关该数据的数据(当前为文本,将来为图像音频)和元数据的集合。Reader Document Document

使用 SimpleDirectoryReader 加载

最容易使用的阅读器是我们的 SimpleDirectoryReader,它从给定目录中的每个文件创建文档。它内置于 LlamaIndex 中,可以读取多种格式,包括 Markdown、PDF、Word 文档、PowerPoint 幻灯片、图像、音频和视频

from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader("./data").load_data()

★ ★ ★ ★ 更多教程请看官方接口文档 Loading Data (Ingestion) - LlamaIndex ★ ★ ★ ★

Starter Tutorial - LlamaIndex + 欢迎使用 Colaboratory - Colab = 在线使用代码

RAG

RAG,也称为检索增强生成,是利用个人或私域数据增强 LLM 的一种范式。通常,它包含两个阶段:

  1. 索引

    构建知识库。

  2. 查询

    从知识库检索相关上下文信息,以辅助 LLM 回答问题。

LlamaIndex 提供了工具包帮助开发者极其便捷地完成这两个阶段的工作。

索引阶段

LlamaIndex 通过提供 Data connectors(数据连接器) 和 Indexes (索引) 帮助开发者构建知识库。

该阶段会用到如下工具或组件:

  • Data connectors

    数据连接器。它负责将来自不同数据源的不同格式的数据注入,并转换为 LlamaIndex 支持的文档(Document)表现形式,其中包含了文本和元数据。

  • Documents / Nodes

    Document是 LlamaIndex 中容器的概念,它可以包含任何数据源,包括,PDF文档,API响应,或来自数据库的数据。

    Node是 LlamaIndex 中数据的最小单元,代表了一个 Document的分块。它还包含了元数据,以及与其他Node的关系信息。这使得更精确的检索操作成为可能。

  • Data Indexes

    LlamaIndex 提供便利的工具,帮助开发者为注入的数据建立索引,使得未来的检索简单而高效。

    最常用的索引是向量存储索引 - VectorStoreIndex

查询阶段

在查询阶段,RAG 管道根据的用户查询,检索最相关的上下文,并将其与查询一起,传递给 LLM,以合成响应。这使 LLM 能够获得不在其原始训练数据中的最新知识,同时也减少了虚构内容。该阶段的关键挑战在于检索、编排和基于知识库的推理。

LlamaIndex 提供可组合的模块,帮助开发者构建和集成 RAG 管道,用于问答、聊天机器人或作为代理的一部分。这些构建块可以根据排名偏好进行定制,并组合起来,以结构化的方式基于多个知识库进行推理。

该阶段的构建块包括:

  • Retrievers

    检索器。它定义如何高效地从知识库,基于查询,检索相关上下文信息。

  • Node Postprocessors

    Node后处理器。它对一系列文档节点(Node)实施转换,过滤,或排名。

  • Response Synthesizers

    响应合成器。它基于用户的查询,和一组检索到的文本块(形成上下文),利用 LLM 生成响应。

RAG管道包括:

  • Query Engines

    查询引擎 - 端到端的管道,允许用户基于知识库,以自然语言提问,并获得回答,以及相关的上下文。

  • Chat Engines

    聊天引擎 - 端到端的管道,允许用户基于知识库进行对话(多次交互,会话历史)。

  • Agents

    代理。它是一种由 LLM 驱动的自动化决策器。代理可以像查询引擎或聊天引擎一样使用。主要区别在于,代理动态地决定最佳的动作序列,而不是遵循预定的逻辑。这为其提供了处理更复杂任务的额外灵活性。

LlamaIndex个性化配置

LlamaIndexRAG 过程提供了全面的配置支持,允许开发者对整个过程进行个性化设置。常见的配置场景包括:

  • 自定义文档分块
  • 自定义向量存储
  • 自定义检索
  • 指定 LLM
  • 指定响应模式
  • 指定流式响应

注,个性化配置主要通过 LlamaIndex 提供的 ServiceContext 类实现。

配置场景示例

接下来通过简明示例代码段展示 LlamaIndex 对各种配置场景的支持。

自定义文档分块
from llama_index import ServiceContext
service_context = ServiceContext.from_defaults(chunk_size=500)
自定义向量存储
import chromadb
from llama_index.vector_stores import ChromaVectorStore
from llama_index import StorageContext

chroma_client = chromadb.PersistentClient()
chroma_collection = chroma_client.create_collection("quickstart")
# 向量存储
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
自定义检索

自定义检索中,我们可以通过参数指定查询引擎(Query Engine)在检索时请求的相似文档数。

index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=5)
指定 LLM
# 指定大语言模型
service_context = ServiceContext.from_defaults(llm=OpenAI())
指定响应模式
query_engine = index.as_query_engine(response_mode='tree_summarize')
指定流式响应
# 流式响应
query_engine = index.as_query_engine(streaming=True)
完整实例

GitHubLlamaIndex-Tutorials/03_Customization/03_Customization.ipynb at main · sugarforever/LlamaIndex-Tutorials
Colab03_Customization.ipynb - Colab

请参考03_Customization.ipynb ,这是一个基于第1课的示例实现上述的所有个性化配置:

  1. 文档分块大小:500
  2. Chromadb作为向量存储
  3. 自定义检索文档数为5
  4. 指定大模型为OpenAI的模型
  5. 响应模式为 tree_summarize
  6. 问答实现流式响应

注,响应模式会在后续课程中详细介绍。


强大的数据连接器

开源教程LlamaIndex-Tutorials/04_Data_Connectors at main · sugarforever/LlamaIndex-Tutorials
演示实例04_Data_Connectors.ipynb - Colab

文档与节点

开源教程LlamaIndex-Tutorials/05_Documents_Nodes at main · sugarforever/LlamaIndex-Tutorials

LlamaPack 新手入门

LlamaPacks - LlamaIndex